热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

子树|祖父_红黑树硬核讲解

篇首语:本文由编程笔记#小编为大家整理,主要介绍了红黑树硬核讲解相关的知识,希望对你有一定的参考价值。因为申请较晚,本公众号没留言,想交流的欢

篇首语:本文由编程笔记#小编为大家整理,主要介绍了红黑树硬核讲解相关的知识,希望对你有一定的参考价值。


因为申请较晚,本公众号没留言,想交流的欢迎添加私人微信,一起相互吹捧,共同进步。



1 引言

预防针:红黑树本来就是基本算法中的难点,所以看此文时建议先有点预备心理或知识铺垫,没接触过RBT而直接看此文的话,绝对懵逼。


为了数据的查询跟增删方便&#xff0c;系统引入了二叉查找树&#xff0c;它具有左节点 <根节点 <右节点 的属性&#xff0c;





二叉查找树(大于跟小于界线应为8&#xff0c;不是12)


但是这种设定跟数据的插入顺序有很大关系&#xff0c;比如你插入的是1234&#xff0c;二叉查找树会退化为链表



链表


为了避免链表结构的出现&#xff0c;研究者们又提出了平衡二叉树红黑树。平衡二叉树要求任意一个节点的左深度跟右深度差值绝对值不能大于1&#xff0c;如果插入后超过了1会通过左右各种旋转来更改连接的变化&#xff0c;最终实现左右深度差不大于1的这个要求。

平衡二叉树的深度要求太过完美&#xff0c;当涉及大量增删时&#xff0c;可能会太多时间用在调节平衡上&#xff0c;为了平衡投入跟产出比&#xff0c;又设计了红黑树

红黑树算是一个比较复杂的数据结构了&#xff0c;除非你面字节&#xff0c;可能让你手写红黑树。一般情况下你只要说出红黑树构造的五大背后逻辑&#xff0c;展现你对底层数据结构的深度跟广度即可。

本文不会着重说红黑树的增删过程&#xff0c;因为你百度看下权威教程或源码&#xff0c;然后跟着追踪就知道大致流程了&#xff0c;本文会说下红黑树为何如此设计&#xff0c;它跟2-3树有啥联系


2 2-3 树

2.1  定义

为了保证查找树的平衡性&#xff0c;需要一些灵活性&#xff0c;因此我们允许树中的一个结点保存多个键。



2-3-4节点

  1. 2结点&#xff1a;含有一个键和两条链接&#xff0c;左链接指向的2-3树中的键都小于该结点&#xff0c;右链接指向的2-3树中的键都大于该结点。

  2. 3结点&#xff1a;含有两个键和三条链接&#xff0c;左链接指向的2-3树中的键都小于该结点&#xff0c;中链接指向的2-3树中的键都位于该结点的两个键之间&#xff0c;右链接指向的2-3树中的键都大于该结点。

  3. 4节点&#xff1a;含有三个键和四条链接&#xff0c;大致的思路跟3节点类似。需注意在2-3树中&#xff0c;4节点是短暂存在的&#xff0c;会被转化为2节点或3节点。


2.2 查找

要判断一个键是否在树中&#xff0c;我们先将它和根结点中的键比较。如果它和其中的任何一个相等&#xff0c;查找命中。否则我们就根据比较的结果找到指向相应区间的链接&#xff0c;并在其指向的子树中递归地继续查找。如果这是个空链接&#xff0c;查找未命中&#xff0c;可以发现跟简单的二叉树查找类似。


2.3 插入

要在2-3树中插入一个新结点&#xff0c;我们可以和二叉查找树一样先进行一次未命中的查找&#xff0c;然后把新结点挂在树的底部。但这样的话树无法保持完美平衡性。使用2-3树的主要原因就在于它能够在插入之后继续保持平衡。



只有3节点树插入数据


插入25


插入4

  1. 如果未命中的查找结束于一个2结点&#xff1a;只要把这个2结点替换为一个3结点&#xff0c;将要插入的键保存在其中即可。

  2. 只有一个3结点的树&#xff0c;向其插入一个新数据&#xff1a;此时我们可以创建个临时4节点&#xff0c;然后将其转化为由3个2节点组成的2-3树

  3. 向一个父结点为2结点的3结点中插入新键&#xff1a;此时先将组成个临时4节点&#xff0c;然后将中间数提到上面跟父节点融合为一个3节点&#xff0c;这样树的高度没变。

  4. 向一个父结点为3结点的3结点中插入新键4&#xff1a;跟上面套路类似&#xff0c;不断将中位数的数据往上提&#xff0c;直到遇到个2节点&#xff0c;或者到达了根节点然后进行拆分。

插入总结&#xff1a;


  1. 先找插入结点&#xff0c;若结点是2结点&#xff0c;则直接插入。如结点3结点&#xff0c;则插入使其临时容纳这个元素&#xff0c;然后分裂此结点&#xff0c;把中间元素移到其父结点中。对父结点亦如此处理。&#xff08;中键一直往上移&#xff0c;直到找到空位&#xff0c;在此过程中没有空位就先搞个临时的&#xff0c;再分裂。&#xff09;

  2. 2-3树插入算法的根本在于这些变换都是局部的&#xff1a;除了相关的结点和链接之外不必修改或者检查树的其他部分。每次变换中&#xff0c;变更的链接数量不会超过一个很小的常数。所有局部变换都不会影响整棵树的有序性和平衡性。


2.4 删除

2-3树的删除分为两种情况。


  1. 如果待删除元素在3节点&#xff0c;那么可以直接将这个元素删除&#xff0c;删除这个元素不会引起高度的变化。



删除3节点中数据


 

  1. 当待删除元素在2节点时&#xff0c;由于删除这个元素会导致2节点失去唯一的元素&#xff0c;引发树中某条路径的高度发生变化&#xff0c;为维持平衡&#xff0c;此时有两种方法。



  1. 先删除再对2-3树进行平衡调整。

  2. 想办法让这个被删除的元素不可能出现在2节点中。如果发现删除元素树2节点则会从兄弟节点或父节点借个元素&#xff0c;当前2节点变为3节点或临时4节点&#xff0c;然后再删除目标数据。




2节点情况下删除目标数据2

2.5 构造

和标准的二叉查找树由上向下生长不同&#xff0c;2-3树的生长是由下向上的



插入

2.6 优点、缺点

优点&#xff1a;


  1. 2-3树在最坏情况下仍有较好的性能。每个操作中处理每个结点的时间都不会超过一个很小的常数&#xff0c;且这两个操作都只会访问一条路径上的结点&#xff0c;所以任何查找或者插入的成本都肯定不会超过对数级别。

  2. 完美平衡的2-3树要平展的多。例如含有10亿个结点的一颗2-3树的高度仅在19到30之间。我们最多只需要访问30个结点就能在10亿个键中进行任意查找和插入操作。

缺点&#xff1a;


  1. 我们需要维护两种不同类型的结点&#xff0c;查找和插入操作的实现需要大量的代码&#xff0c;而且它们所产生的额外开销可能会使算法比标准的二叉查找树更慢。

  2. 平衡一棵树的初衷是为了消除最坏情况&#xff0c;但我们希望这种保障所需的代码能够越少越好&#xff0c;越简单越好&#xff0c;显然2-3树也不太适合。

既然已经懂了2-3树的实现&#xff0c;接下来我们对2-3树稍微变型下就是红黑树了&#xff0c;你可以认为红黑树的本质其实是对概念模型2-3-4树的一种实现


3  红黑树

3.1  2-3树跟红黑树关联

由于直接进行不同节点间的转化会造成较大的开销&#xff0c;所以选择以二叉树为基础&#xff0c;在二叉树的属性中加入一个颜色属性来表示2-3树中不同的节点。


  1. 2-3树中的2节点对应着红黑树中的黑色节点。

  2. 2-3树中的非2节点是以红节点 &#43; 黑节点的方式存在&#xff0c;红节点的意义是与黑色父节点结合&#xff0c;表达着2-3树中的3&#xff0c;4节点。有的书上把红色说成了红色链接&#xff0c;也是一直理解方法。

先看2-3树到红黑树的节点转换。2节点直接转化为黑色节点。3节点这里可以有两种表现形式&#xff0c;左倾红节点或者右倾红节点。而4节点被强制要求转化为一个黑父带着左右两个红色儿子。



23树到红黑树转变


由于3节点转化到时候可以左倾也可以右倾&#xff0c;如果查看算法书籍&#xff0c;你会发现为了简单化&#xff0c;算法书籍中统一规定只用左倾红黑树。

红黑树跟2-3树转化到时候&#xff0c;可以认为将红色节点顺时针上升45度&#xff0c;来跟它到父节点保持平衡&#xff0c;再将红色到跟父节点看作一个整体。



红黑树转2-3树


可以发现黑色节点才会真正在2-3树中增加高度&#xff0c;所以红黑树的完美平衡其实等价2-3树的根节点到叶子节点到距离相等。所以说红黑树是2-3树或2-3-4树概念模型的一种实现


  1. 算法导论中红黑树树基于2-3-4树实现的。

  2. 算法4中红黑树树基于2-3树实现的&#xff0c;并且要求3节点在红黑树中必须以左倾红色节点来表示。

  3. 2-3树肯定比2-3-4树简单&#xff0c;所以接下来主要基于2-3树说。


3.2 红黑树基础定义跟旋转

3.2.1 五大法则


  1. 节点有黑色跟红色两种&#xff1a;至于为何有红色节点&#xff0c;在2-3树中已经说过了。

  2. 根节点必须是黑色&#xff1a;2-3树中如果根节点树2节点那本来就是黑色&#xff0c;如果是3节点就用大的当黑根节点&#xff0c;小的当左倾红节点。

  3. 叶子节点为不存数据且都是黑色&#xff1a;主要是为了在插入跟删除时候方便操作。

  4. 任意节点到叶子节点经过的黑色节点数目相同&#xff1a;红黑树中的红节点是和黑色父节点绑定的&#xff0c;在2-3树中本来就是同一层的&#xff0c;只有黑色节点才会在2-3树中真正贡献高度&#xff0c;由于2-3树的任一节点到空链接距离相同&#xff0c;因此反应在红黑树中就是黑色完美平衡。

  5. 不会有连续的红色节点&#xff1a;2-3树中本来就规定没有4节点&#xff0c;2-3-4树中虽然有4节点&#xff0c;但是要求在红黑树中体现为一黑色节点带两红色儿子&#xff0c;分布左右&#xff0c;所以也不会有连续红节点。

3.2.2 左旋跟右旋

红黑树要求新插入数据颜色是红色&#xff0c;黑色是改变后的结果。红黑树的核心是左旋右旋



左旋跟右旋

3.3  左倾红黑树插入

左倾红黑树的插入一共有三种可能的情况。



插入20

 

  1. 待插入元素比黑父大&#xff0c;插在了黑父的右边&#xff0c;而黑父左边是红色儿子。这种情况会导致在红黑树中出现右倾红节点。或者黑父左边为空也会出现右倾。

  2. 待插入元素比红父小&#xff0c;且红父自身就是左倾&#xff0c;待插入数据比红父左节点还小&#xff0c;形成了连续的红节点。



  1. 对红父的父亲节点进行一次右旋转。

  2. 将数据变化为情况1的状态处理。




插入14

 

  1. 待插入元素比红父大&#xff0c;且红父自身就是左倾。待插入数据比红父左节点大&#xff0c;形成了右倾。通过左旋变成情况2处理。



插入17


整体来说左倾红黑树的插入就是这3种情况来回切换&#xff0c;最终达到平衡。


3.4 左倾红黑树删除

删除思路是不删除目标数据&#xff0c;而是找到目标数据的前驱节点后继节点&#xff0c;然后把数据拷贝一份到目标数据进行覆盖。然后转而去删除前驱或后继。删除后再去修补平衡。

从宏观上来看从根节点开始查找&#xff0c;全程利用2-3树思维逐层对红黑树调整&#xff0c;每次保证当前节点树2-3树中非2节点&#xff0c;如果是非2节点则看下一层&#xff0c;如果是2节点则根据兄弟节点调整。


  1. 兄弟节点是2节点&#xff0c;从父节点借个数据跟当前节点及兄弟节点形成临时4节点。

  2. 兄弟节点是非2节点&#xff0c;兄弟节点上升一个数据&#xff0c;父节点下降一个数据。



删除目标1

删除后就涉及到数据平衡修复了&#xff0c;还是根据2-3树来修复平衡&#xff0c;路上可能会碰到红色右倾节点&#xff0c;遇到就进行一次左旋即可。



2-3树修补工作

3.5 工业级红黑树增加

这里其实主要参考极客时间小争哥的文章&#xff0c;说下实际工程中红黑树的增删操作&#xff0c;增加主要有3种情况&#xff1a;



情况1

情况1&#xff1a;关注节点是 a&#xff0c;它的叔叔节点 d 是红色&#xff1a;


  1. 将关注节点 a 的父节点 b、叔叔节点 d 的颜色都设置成黑色。

  2. 将关注节点 a 的祖父节点 c 的颜色设置成红色。

  3. 关注节点变成 a 的祖父节点 c&#xff0c;实现关注节点的迁移。

  4. 跳到情况2或情况3。



情况2


情况2&#xff1a;关注节点是 a&#xff0c;它的叔叔节点 d 是黑色&#xff0c;关注节点 a 是其父节点 b 的右子节点&#xff1a;


  1. 关注节点变成节点 a 的父节点 b。

  2. 围绕新的关注节点 b 左旋。

  3. 跳到情况3。



情况3

情况3&#xff1a;如果关注节点是 a&#xff0c;它的叔叔节点 d 是黑色&#xff0c;关注节点 a 是其父节点 b 的左子节点&#xff0c;我们就依次执行下面的操作&#xff1a;


  1. 围绕关注节点 a 的祖父节点 c 右旋。

  2. 将关注节点 a 的父节点 b、兄弟节点 c 的颜色互换&#xff0c;调整结束。


3.6 工业级红黑树删除

相比插入&#xff0c;删除就难多了&#xff01;核心思想是找准关注点&#xff0c;根据关注点跟周围节点排布特征按照一定规则调整。主要俩步骤&#xff1a;


  1. 针对删除节点调整后仍要满足节点到叶子节点路径包含相同黑色节点。

  2. 针对关注节点二次调整&#xff0c;防止出现2个红色节点。

算法导论中说如果删除黑节点X带来黑色平衡破坏&#xff0c;让X的子节点变为黑-黑红-黑。意思是既然删除了某个黑色节点&#xff0c;那么必然会破坏以这个黑色节点为路径上的黑色平衡&#xff0c;表现为路径中缺少一个黑&#xff0c;所以要想办法补充一个黑色节点(下面会用黑色圆圈表示)。同时如果一个节点既可以红又可以黑&#xff0c;就用红黑两个组成部分表示。

3.6.1 删除第一步



情况1


情况1&#xff1a;要删除的节点是 a&#xff0c;它只有一个子节点 b&#xff1a;


  1. 删除节点 a&#xff0c;并且把节点 b 替换到节点 a 的位置&#xff0c;这一部分操作跟普通的二叉查找树的删除操作一样。

  2. 节点 a 只能是黑色&#xff0c;节点 b 也只能是红色&#xff0c;其他情况均不符合红黑树的定义。此时把节点 b 改为黑色。调整结束&#xff0c;不需要进行二次调整。



情况2


情况2&#xff1a;要删除的节点 a 有两个非空子节点&#xff0c;并且它的后继节点就是节点 a 的右子节点 c&#xff1a;


  1. 如果节点 a 的后继节点就是右子节点 c&#xff0c;那 c 肯定没有左子树。将c的颜色变为a的颜色&#xff0c;并且用c来覆盖a。

  2. 如果节点 c 是黑色&#xff0c;为了不违反红黑树的路径相同原则&#xff0c;给节点 c 的右子节点 d 多加一个黑色圆圈&#xff0c;这个时候节点 d 就成了红 - 黑或者黑 - 黑

  3. 此时关注节点变成了节点 d&#xff0c;第二步的调整操作就会针对关注节点来做。



情况3


情况3&#xff1a;要删除的是节点 a&#xff0c;它有两个非空子节点&#xff0c;并且节点 a 的后继节点不是a的右子节点&#xff1a;


  1. 找到后继节点 d&#xff0c;并将它删除&#xff0c;删除后继节点 d 的过程参照 CASE 1。

  2. 用d来替换a&#xff0c;并且d的颜色设置的跟a颜色一样。

  3. 如果节点 d 是黑色&#xff0c;为了不违反红黑树路径相同原则&#xff0c;给节点 d 的右子节点 c 多加一个黑色&#xff0c;这个时候节点 c 就成了红 - 黑或者黑 - 黑

  4. 此时关注节点变成了节点 c&#xff0c;第二步的调整操作就会针对关注节点来做。

3.6.2 删除第二步

经过初步调整之后&#xff0c;关注节点变成了红 - 黑或者黑 - 黑    节点。针对这个关注节点&#xff0c;再分四种情况来进行二次调整。二次调整是为了让红黑树中不存在相邻的红色节点。



情况1


情况1&#xff1a;关注节点是 a&#xff0c;它的兄弟节点 c 是红色的&#xff0c;我们就依次进行下面的操作&#xff1a;


  1. 围绕关注节点 a 的父节点 b 左旋。

  2. 关注节点 a 的父节点 b 和祖父节点 c 交换颜色。

  3. 关注节点不变&#xff0c;继续从四种情况中选择适合的规则来调整。



情况2


情况2&#xff1a;关注节点是 a&#xff0c;它的兄弟节点 c 是黑色&#xff0c;并且节点 c 的左右子节点 d、e 都是黑色&#xff1a;


  1. 将关注节点 a 的兄弟节点 c 的颜色变成红色&#xff0c;因为接下来黑圆圈会上移&#xff0c;那么c比a多个深色。

  2. 从关注节点 a 中去掉一个黑色&#xff0c;此时节点 a 就是单纯的红色或者黑色。

  3. 给关注节点 a 的父节点 b 添加一个黑色&#xff0c;这个时候节点 b 就变成红 - 黑或者黑 - 黑

  4. 关注节点从 a 变成其父节点 b&#xff0c;继续从四种情况中选择符合的规则来调整。



情况3

情况3&#xff1a;关注节点是 a&#xff0c;它的兄弟节点 c 是黑色&#xff0c;c 的左子节点 d 是红色&#xff0c;c 的右子节点 e 是黑色&#xff1a;


  1. 围绕关注节点 a 的兄弟节点 c 右旋。

  2. 节点 c 和节点 d 交换颜色。

  3. 关注节点不变&#xff0c;跳转到情况4&#xff0c;继续调整。



情况4

情况4&#xff1a;关注节点 a 的兄弟节点 c 是黑色的&#xff0c;并且 c 的右子节点是红色的&#xff0c;我们就依次进行下面的操作&#xff1a;


  1. 围绕关注节点 a 的父节点 b 左旋。

  2. 将b的颜色复制给c&#xff0c;因为c替代了b的位置。

  3. 将关注节点 a 的父节点 b 的颜色设置为黑色。

  4. 从关注节点 a 中去掉一个黑色&#xff0c;节点 a 就变成了单纯的红色或黑色。

  5. 将关注节点 a 的叔叔节点 e 设置为黑色&#xff0c;调整结束。

  6. 此时a跟d深度是一样的&#xff0c;因为无法判别ad是否为红&#xff0c;直接将b设置为黑的了&#xff0c;此时e提高了一度为保持平衡也设置为黑色的了。

3.6.3 删除理解


  1. 多画图&#xff0c;不画图单看代码一会儿就眩晕了。

  2. 插入跟删除算法都是用到了递推&#xff0c;比如插入情况1&#xff0c;情况1的处理之后&#xff0c;关注节点从本身变成了它的祖父红色节点&#xff0c;这就是往根节点递推。不过情况1处理过一次之后&#xff0c;不一定会进入情况2或者情况3&#xff0c;有可能还在情况1。在情况1的情况下一直往根节点走&#xff0c;因为当前节点永远是红色&#xff0c;所以在最后要把根节点涂黑。同时只要进入到情况2、情况3情况&#xff0c;操作就跟上面说过的类似了。

  3. 要记住&#xff0c;除了关注的节点所在的子树&#xff0c;其他的子树本身都是一颗红黑树&#xff0c;它们是满足红黑树的所有特征的。当关注节点往根节点递推时&#xff0c;这个时候关注节点的子树也已经满足了红黑树的定义&#xff0c;我们就不用再去特别关注子树的特征。只要注意关注节点往上的部分。这样就能把问题简化&#xff0c;思考的时候思路会清晰一些。

  4. 再说到删除算法&#xff0c;注意红-黑黑-黑存在的原因&#xff0c;为何最终都会走到从兄弟节点的地方做文章来实现最终的平衡。

  5. 删除情况1的目的只是为了能够进入接下来的三个情况中。

  6. 删除情况2的套路又是一个递推思路&#xff0c;关注节点往根节点递推&#xff0c;让其左右子树都满足红黑树的定义。因为往上推&#xff0c;右子树多了一个黑色节点&#xff0c;就把关注节点的兄弟节点变红。

  7. 删除情况3是为了进入删除情况4&#xff0c;提前变色的原因和情况2是一样的&#xff0c;都是为了满足黑色深度相同。同样是归纳推理的思路。都要记住一点&#xff0c;各种情况下的其他子树节点都满足红黑树的定义&#xff0c;需要分类讨论的&#xff0c;都在这几种情况中了。

  8. 可能你看今天看了红黑树的删除你顿悟了&#xff0c;过了半个月又迷糊了。不要怕&#xff01;因为怕也没用&#xff0c;再看呗。学习红黑树本身也不是为了面试字节去默写&#xff0c;而是去学习思想&#xff0c;锻炼思维&#xff0c;复杂问题简单化&#xff0c;当然了顺带也可以装的一手好B。


4  总结

本文的重点不在于讲解工业化红黑树的删除跟插入全部过程&#xff0c;只是希望通过2-3树跟左倾红黑树的增删&#xff0c;让大家从本质上理解下红黑树的操作来源。其中工业化删除部分已征得小争哥同意&#xff0c;如果理解了上面的内容&#xff0c;那么你再去看工业化红黑树的操作就手到擒来了。


参考


  1. 红黑树在线演示&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  2. 2-3树到红黑树讲解&#xff1a;https://blog.csdn.net/qq_35190492/article/details/109503539

  3. 小争哥极客时间红黑树&#xff1a;https://time.geekbang.org/column/article/68976




推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
author-avatar
happy柒月卍520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有